<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de usuario
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Usuario extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        // Carrega o model DAOItem
        $this->load->model('DAOUsuario');

        //Seta propriedades do template
        $arr_js = $this->config->item('js');
        array_push($arr_js, 'maskedinput');
        array_push($arr_js, 'jquery.cookie');
        array_push($arr_js, 'jquery.lightbox-0.5');
        $this->template->load_js($arr_js);
        $this->template->set('title', 'Cadastro de Usuário || ' . $this->title);
        $this->template->set('page_title', 'Cadastro de Usuário');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Não é permitido cadastro duplicado de <span class="bold">USUÁRIOS</span>, então verifique se o usuário a ser inserido não possui cadastro.</p>
                        <p><span class="bold">Só é possível excluir um USUÁRIO se ele não estiver relacionado com movimentações de um item.</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar um novo Usuário.</p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de usuário
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_USUARIO);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $usuarios = $this->DAOUsuario->select_all_users($init, $total_pagina, $this->order_by, $this->direction);
            $total_rows = $this->DAOUsuario->amount_all_users();

            // paginação
            $config['uri_segment'] = 6;
            $config['base_url'] = base_url() . "usuario/listar/" . $this->order_by_name . '/' . $this->direction_name . '/' . $total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['usuarios'] = $usuarios;
            $data['quant_list'] = $total_pagina;
            $this->load->model('DAOGrupo');
            $data['grupos'] = $this->DAOGrupo->select_all_groups(0, NULL, NULL, NULL, FALSE);

            $this->template->load(NULL, 'usuario_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_user();
        }
    }
    
    
    /**
     * Retorna via json o usuário selecionado
     */
    public function get_user_json() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idUsuario", "Código", "trim|required|min_length[6]|max_length[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $usuario = new TOUsuario();
                $usuario->id = $this->input->post('idUsuario', TRUE);

                $data['usuario'] = $this->DAOUsuario->get_user($usuario->id);
                $data['usuario']->data_nascimento = format_date($data['usuario']->data_nascimento, FALSE);
                
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_user();
        }
    }
    
    /**
     * Cadastra usuário
     * 
     * @throws ExceptionValidacao
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_USUARIO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("sobrenome", "Sobrenome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("email", "E-mail", "trim|required|valid_email|xss_clean");
            $this->form_validation->set_rules("re_email", "Redigitação do E-mail", "trim|required|valid_email|matches[email]|xss_clean");
            $this->form_validation->set_rules("senha", "Senha", "trim|min_length[4]");
            $this->form_validation->set_rules("re_senha", "Redigitação da Senha", "trim|min_length[4]|matches[senha]");
            $this->form_validation->set_rules("data_nascimento", "Data de Nascimento", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("grupo_id", "Grupo(s)", "trim|required|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|required|min_length[1]|max_length[1]|xss_clean");
            $this->input->post('status', TRUE) == TOUsuario::USER_INATIVO ? $this->form_validation->set_rules("motivo_inatividade", "Motivo", "trim|required|min_length[5]|max_length[245]|xss_clean")  : '';
            $this->form_validation->set_rules("fakeImagem", "Imagem", "trim|xss_clean");
            
            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $usuario = new TOUsuario();
                $usuario->nome = $this->input->post('nome', TRUE);
                $usuario->sobrenome = $this->input->post('sobrenome', TRUE);
                $usuario->email = $this->input->post('email', TRUE);
                $usuario->data_nascimento = format_date($this->input->post('data_nascimento', TRUE), FALSE, FALSE);
                $usuario->senha = $this->input->post('senha', FALSE) != NULL ? $this->input->post('senha', FALSE) : date('dmY', strtotime($usuario->data_nascimento));
                $usuario->data_cadastro = date('Y-m-d H:i:s');
                $usuario->status = $this->input->post('status', TRUE);
                $usuario->status == TOUsuario::USER_INATIVO ? $usuario->motivo_inatividade = $this->input->post('motivo_inatividade', TRUE) : $usuario->motivo_inatividade = NULL;
                
                /**
                 * Preparando os grupo do usuario
                 */
                $grupos = explode(',', $this->input->post('grupo_id', TRUE));
                $usuario->grupos = array();
                foreach ($grupos as $value) {
                    $grupos_user = new TOGrupo();
                    $grupos_user->id = $value;
                    array_push($usuario->grupos , $grupos_user);
                }
                
                /**
                 * Faz upload da imagem caso ela exista
                 */
                $imagem = $this->input->post('fakeImagem', TRUE);
                if (!empty($imagem)) {
                    $this->load->model('UploadImage'); // carrega o Model que contem o método para upload

                    $limit_name = crop_string($usuario->nome . ' ' . $usuario->sobrenome, 45, TRUE); // Limita o tamanho do nome em 25 caracteres
                    $img_name = remove_accents($limit_name); // remove acentos e caracteres especiais

                    $data_img = $this->UploadImage->do_upload($this->config->item('path_img_user'), $img_name, 375, 500, FALSE);
                   
                    // Se o Upload foi feito com sucesso
                    !empty($data_img) ? $usuario->imagem = $data_img['file_name'] : '';
                } else {
                    //Caso não foi selecionado imagem é salvo a imagem padrão
                    $usuario->imagem = $this->config->item('img_upload_default');
                }
                
                // Se tudo for OK insere
                $this->DAOUsuario->insert_user($usuario);

                Mensagem::setMensagemSucesso("Usuário: <span class='bold'>" . $usuario->nome . ' ' . $usuario->sobrenome . "</span> cadastrado com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    /**
     * Atualiza usuáro
     * 
     * @throws ExceptionValidacao
     */
    public function atualizar() {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_USUARIO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigo", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("sobrenome", "Sobrenome", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("email", "E-mail", "trim|required|valid_email|xss_clean");
            $this->form_validation->set_rules("re_email", "Redigitação do E-mail", "trim|required|valid_email|matches[email]|xss_clean");
            $this->form_validation->set_rules("senha", "Senha", "trim|min_length[4]");
            $this->form_validation->set_rules("re_senha", "Redigitação da Senha", "trim|min_length[5]|matches[senha]");
            $this->form_validation->set_rules("data_nascimento", "Data de Nascimento", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("grupo_id", "Grupo(s)", "trim|required|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|required|min_length[1]|max_length[1]|xss_clean");
            $this->input->post('status', TRUE) == TOUsuario::USER_INATIVO ? $this->form_validation->set_rules("motivo_inatividade", "Motivo", "trim|required|min_length[5]|max_length[245]|xss_clean")  : '';
            $this->form_validation->set_rules("fakeImagem", "Imagem", "trim|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $usuario = new TOUsuario();
                $usuario->id = $this->input->post('codigo', TRUE);
                $usuario->nome = $this->input->post('nome', TRUE);
                $usuario->sobrenome = $this->input->post('sobrenome', TRUE);
                $usuario->email = $this->input->post('email', TRUE);
                $usuario->senha =  $this->input->post('senha', FALSE) != NULL ? $this->input->post('senha', FALSE) : NULL;
                $usuario->data_nascimento = format_date($this->input->post('data_nascimento', TRUE), FALSE, FALSE);
                $usuario->status = $this->input->post('status', TRUE);
                $usuario->status == TOUsuario::USER_INATIVO ? $usuario->motivo_inatividade = $this->input->post('motivo_inatividade', TRUE) : $usuario->motivo_inatividade = NULL;

                /**
                 * Preparando os grupo do usuario
                 */
                $grupos = explode(',', $this->input->post('grupo_id', TRUE));
                $usuario->grupos = array();
                foreach ($grupos as $value) {
                    $grupos_user = new TOGrupo();
                    $grupos_user->id = $value;
                    array_push($usuario->grupos, $grupos_user);
                }

                /**
                 * Faz upload da imagem caso ela exista
                 */
                $imagem = $this->input->post('fakeImagem', TRUE);
                $imagem_original = $this->input->post('imagem_original', TRUE);
                $this->load->model('UploadImage'); // carrega o Model que contem o método para upload
                if (!empty($imagem) && $imagem != $imagem_original) {
                    //APAGA as IMAGEM ANTIGA do diretorio
                    $this->UploadImage->delete_image($this->config->item('path_img_user'), $imagem_original);
                    
                    $limit_name = crop_string($usuario->nome . ' ' . $usuario->sobrenome, 45, TRUE); // Limita o tamanho do nome em 25 caracteres
                    $img_name = remove_accents($limit_name); // remove acentos e caracteres especiais

                    $data_img = $this->UploadImage->do_upload($this->config->item('path_img_user'), $img_name, 375, 500, FALSE);

                    // Se o Upload foi feito com sucesso
                    !empty($data_img) ? $usuario->imagem = $data_img['file_name'] : '';
                    
                } elseif ($imagem == NULL) {
                    //APAGA a IMAGEM ANTIGA do diretorio
                    $this->UploadImage->delete_image($this->config->item('path_img_user'), $imagem_original);

                    //Caso seja solicitado atualizar sem imagem, é atualizado com a imagem padrão
                    $usuario->imagem = $this->config->item('img_upload_default');
                }
                
                // Se tudo ocorreu bem atualiza o usuario
                $this->DAOUsuario->update_user($usuario);

                Mensagem::setMensagemSucesso("Usuário: <span class='bold'>" . $usuario->nome . ' ' . $usuario->sobrenome . "</span> atualizado com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    /**
     * Busca usuário
     */
    public function buscar() {
        try {
            $this->load->helper('text');
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $usuarios = $this->DAOUsuario->search_user($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows = $this->DAOUsuario->amount_search_user($searchterm);

            //paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "usuario/buscar/" . $this->order_by_name . "/" . $this->direction_name . "/". $total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['usuarios'] = $usuarios;
            $data['quant_list'] = $total_pagina;
            $this->load->model('DAOGrupo');
            $data['grupos'] = $this->DAOGrupo->select_all_groups(0, NULL, NULL, NULL, FALSE);


            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para esta pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL, 'usuario_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }

    
    /**
     * Exclui usuário
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_USUARIO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[2]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $usuario = new TOUsuario();
                $id_users = explode(',', $this->input->post('codigoDelete', TRUE)); // Monta array com os ids 
                $usuario->nome = $this->input->post('nomeDelete', TRUE);
               
                foreach ($id_users as $id_vez){
                   $user_vez = $this->DAOUsuario->get_user($id_vez);
                   $usuario->id = $user_vez->id;
                   $usuario->imagem = $user_vez->imagem;
                   
                   $this->DAOUsuario->delete_user($usuario);
                }

                count($id_users) > 1 != NULL ? Mensagem::setMensagemSucesso("Usuários  excluídos com sucesso!") : Mensagem::setMensagemSucesso("Usuário: <span class='bold'>" . $usuario->nome . "</span> excluído com sucesso!");

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    /**
     * Função para selciocionar usuario no auto_complete
     */
    public function auto_complete_usuario() {
        $term = $this->input->get('term', TRUE);
        header("Content-type: application/json");
        echo json_encode($this->DAOUsuario->suggestion_users($term));
    }

    private function view_list_user() {
        $this->template->load(NULL, 'usuario_list');
    }

}
